<?php
/**
 * ルータークラス
 * ルートクラスとは意味が違う。
 * root class と router classなので。
 * どうでもいいが。
 */
class route {
	private $Path;
	private $RouteYMLPath;
    public function __construct() {
    	$this->Path = null;
    	$this->RouteYMLPath = null;
    }

	public function init () {
	}

	/**
	 * アプリを実行する
	 * リクエストからモジュールを解析して実行する。
	 */
	public function call () {
		if (Y('Logger.Debug$')) {
			Y('Logger.Debug', 'ルーティング開始');
			ini_set ('display_errors', 'On');
			Y('Logger.Debug', 'デバッグモード用設定');
		}

		// リクエストクラスをcall
		Y('Request');
		
		$this->Path = strtolower (Y('Request.global.uri'));

		$RequestYML = $this->getRoute ();
		if (file_exists($RequestYML)) {
			// 取得したYMLでappを上書きする
			$YMLReader = new YamlReader();
			$Request = $YMLReader->Load($RequestYML);
			foreach ($Request as $Key=>$Val) {
				if (is_array($Val)) {
				    Y('app.'.$Key.'+', array_merge_recursive(Y('app.'.$Key), $Val));
				} else {
				    Y('app.'.$Key.'+', $Val);
				}
			}
		}
		
		Y('this.Path+', $this->Path);

		$Template = '';
		$Modules = array();

		if ($Request = Y('App.Route')) {
			// リクエストクエリの解読
			if (Y('Logger.Debug$')) Y('Logger.Debug', 'リクエストクエリ : '.$Request);

			$eRequest = explode ('?', $Request, 2);	
			$Template = $eRequest[0];
			if (isset($eRequest[1])) $Modules = explode ('&', $eRequest[1]);
		}

		// 一度すべてのロードを済ませてからコールする
		foreach ($Modules as $Module) {
			$ModuleName = explode ('=', $Module);
			$Args = array_merge (array('Module.load'), array($ModuleName[0]));
			call_user_func_array('Y', $Args);
		}
		foreach ($Modules as $Module) {
			$ModuleName = explode ('=', $Module);
			$Args = array_merge (array('Module.loadAction'), $ModuleName);
			if (call_user_func_array('Y', $Args) === false) return true;
		}

		Y('Document', $Template);
		return true;
	}

	/**
	 * リクエストの解読再帰処理を行う
	 * 最終的にヒットするまでグローバルリクエストをシフトしていく。
	 * 
	 * edit 2010/08/28 YMLでのルーティング指定からディレクトリでの指定に変更
	 */
	private function getRoute () {
		// 指定のルーティング情報が存在するか
		$strRouteDir = DIR_BASE_SYS.'/app/route/'.$this->Path;

		if ($this->Path == "") return ($strRouteDir.'/index.yml');

		if (file_exists ($strRouteDir.'/index.yml')) {
			return $strRouteDir.'/index.yml';
		} else {
			// 存在しない場合、ひとつ上のディレクトリを捜索する
			$this->Path = substr ($this->Path, 0, strrpos ($this->Path, '/'));
			return $this->getRoute ();
		}
	}
}
?>